package com.demo.system.config.ws;

import com.demo.system.service.impl.MyWebSocketHandler;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

/**
 * WebSocket配置类
 * <p>
 * 这个配置类负责设置和注册WebSocket处理器，配置WebSocket端点和相关的安全策略。
 * 通过实现WebSocketConfigurer接口，可以自定义WebSocket的行为和路由配置。
 *
 * @author why
 * @description WebSocket核心配置，负责处理聊天室功能的WebSocket连接
 * @date 2025/9/23 10:22
 */
@Slf4j
@Configuration  // 标记为Spring配置类
@EnableWebSocket  // 启用WebSocket支持
@RequiredArgsConstructor  // Lombok注解，自动生成带final字段的构造函数
public class WebSocketConfig implements WebSocketConfigurer {

    /**
     * 注入自定义的WebSocket处理器
     * 该处理器负责处理具体的WebSocket连接、消息收发等业务逻辑
     */
    private final MyWebSocketHandler myWebSocketHandler;

    /**
     * 注册WebSocket处理器
     * <p>
     * 这个方法是WebSocketConfigurer接口的核心方法，用于配置WebSocket的路由和处理器。
     * 在这里定义了哪些URL路径会被WebSocket处理，以及使用哪个处理器来处理这些连接。
     *
     * @param registry WebSocket处理器注册表，用于注册处理器和配置路径
     */
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        // 注册WebSocket处理器到指定路径
        // "/ws/chat/**" 表示所有以/ws/chat/开头的路径都会被这个处理器处理
        // 例如: /ws/chat/user_123, /ws/chat/room_456 等
        registry.addHandler(myWebSocketHandler, "/ws/chat/**")
                .setAllowedOrigins("*")  // 允许所有域名访问（生产环境建议限制具体域名）
                .setAllowedOriginPatterns("*");  // 允许所有源模式（支持通配符）

        // 注册SockJS支持（兼容不支持WebSocket的浏览器）
        registry.addHandler(myWebSocketHandler, "/sockjs/chat/{userId}")
                .setAllowedOrigins("*")
                .withSockJS();
        // 记录WebSocket配置信息，便于调试和运维
        log.info("WebSocket处理器已注册到路径: /api/ws/chat/** 和 /ws/chat/**");
        log.info("WebSocket测试URL: ws://localhost:8084/api/ws/chat/用户ID");
    }
}
